Copy Constructor

클래스의 복사생성자가 내부 구성 요소들을 적합하게 복사하도록 구현한다.
struct Contact{
strint name;
Address* address;
Contact(const Contact& other): name(other.name){
address=new Adddress(
other.address->street,
other.address->city,
other.address->suite
); //
}
};
위처럼 Contact 내부에서 Address 각 항목의 값을 할당하는 것은 의존성을 만든다.
Address 클래스에도 생성자를 만들어 주어 의존성을 낮출 수 있다.
Address(const string& street, const string& city, const int suite): street(street), city(city), suite(suite) {}
/* or
Address(const Address& other): street(other.street), city(other.steet), suite(other.suite) {}
*/
// Address Contact
Contact(const Contact& other): name(other.name), address(new Address{*other.address}) {}
//
Contact& operator=(const Contact& other){
if(this==&other) return *this;
name=other.name;
address=other.address;
return *this;
}
//
Contact worker{"", new Address{"123 East Dr", "London", 0}};
Contact john{worker};// or Contact john=worker;
john.name="John";
john.suite=10;
복사 생성자와 복사 대입 연산자는 컴파일러가 default로 생성한다.
컴파일러가 생성한 복사 생성자와 복사 대입 연산자가 옳바르지 않더라도 컴파일 에러 없이 문제를 일으킬 수 있다.

아래와 같은 인터페이스를 이용해 복사가 필요할 때, 복사본을 생성해서 반환하는 clone 메서드를 이용할 수 있다.
template <typename T> struct Cloneable{
virtual T clone() const =0;
};
복제를 할 함수에 대하여 Cloneable 인터페이스를 상속해서 clone 메서드를 구현한다.